package logger

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"io"
	"os"
	"path/filepath"
	"strings"
	"sync"
	"time"
)

var MainLog = InitLogger("./logs", "main")

// DateRotatingWriter 按日期分割的日志写入器
type DateRotatingWriter struct {
	baseDir     string     // 日志目录
	prefix      string     // 日志文件前缀
	currentFile *os.File   // 当前打开的文件
	lastDate    string     // 最后写入的日期
	mu          sync.Mutex // 保证线程安全
}

// NewDateRotatingWriter 创建按日期分割的写入器
func NewDateRotatingWriter(baseDir, prefix string) (*DateRotatingWriter, error) {
	// 创建日志目录a
	if err := os.MkdirAll(baseDir, 0755); err != nil {
		return nil, fmt.Errorf("创建日志目录失败: %w", err)
	}

	writer := &DateRotatingWriter{
		baseDir: baseDir,
		prefix:  prefix,
	}

	// 初始化时打开当天的日志文件
	if err := writer.rotateIfNeeded(); err != nil {
		return nil, err
	}

	return writer, nil
}

// rotateIfNeeded 检查并切换日志文件（日期变更时）
func (w *DateRotatingWriter) rotateIfNeeded() error {
	// 获取当前日期（格式：2006-01-02）
	today := time.Now().Format("2006-01-02")

	// 日期未变且文件已打开，无需切换
	if today == w.lastDate && w.currentFile != nil {
		return nil
	}

	// 关闭之前的文件
	if w.currentFile != nil {
		if err := w.currentFile.Close(); err != nil {
			return fmt.Errorf("关闭旧日志文件失败: %w", err)
		}
	}

	// 生成新的日志文件名
	filename := filepath.Join(w.baseDir, fmt.Sprintf("%s-%s.log", w.prefix, today))

	// 打开新文件（追加模式，不存在则创建）
	file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		return fmt.Errorf("打开新日志文件失败: %w", err)
	}

	// 更新当前文件和日期
	w.currentFile = file
	w.lastDate = today
	return nil
}

// Write 实现io.Writer接口，写入日志并自动切换文件
func (w *DateRotatingWriter) Write(p []byte) (n int, err error) {
	w.mu.Lock()
	defer w.mu.Unlock()

	// 检查是否需要切换文件
	if err := w.rotateIfNeeded(); err != nil {
		return 0, err
	}

	// 写入当前文件
	return w.currentFile.Write(p)
}

// Close 关闭日志文件
func (w *DateRotatingWriter) Close() error {
	w.mu.Lock()
	defer w.mu.Unlock()

	if w.currentFile != nil {
		return w.currentFile.Close()
	}
	return nil
}

// 自定义日志格式
type CustomFormatter struct {
	TimestampFormat string
	ForceColors     bool
}

// Format 实现logrus.Formatter接口
func (f *CustomFormatter) Format(entry *logrus.Entry) ([]byte, error) {
	// 格式化时间
	timestamp := entry.Time.Format(f.TimestampFormat)
	level := strings.ToUpper(entry.Level.String())
	// 构建日志行：级别[时间] 消息
	line := fmt.Sprintf("[%s]-[%s] %s\n",
		level,
		timestamp,
		entry.Message)

	return []byte(line), nil
}

// InitLogger 初始化logrus日志，仅使用标准库和logrus
func InitLogger(logDir, prefix string) *logrus.Logger {
	// 创建按日期分割的写入器
	rotatingWriter, err := NewDateRotatingWriter(logDir, prefix)
	if err != nil {
		panic(fmt.Sprintf("初始化日志写入器失败: %v", err))
	}

	// 初始化logrus
	logger := logrus.New()

	// 设置输出：同时输出到控制台和文件
	multiWriter := io.MultiWriter(os.Stdout, rotatingWriter)
	logger.SetOutput(multiWriter)

	// 设置自定义日志格式
	logger.SetFormatter(&CustomFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	})

	// 设置日志级别
	//logger.SetLevel(logrus.DebugLevel)
	logger.SetLevel(logrus.InfoLevel)
	return logger
}
